package com.sojson.util.mq.rabbit.code.interfaces;

import java.io.IOException;
import java.util.Map;

import com.rabbitmq.client.AMQP.Queue.DeclareOk;
import com.rabbitmq.client.Channel;
import com.sojson.util.mq.rabbit.interfaces.IRabbitBaseQueueUtil;

/**
 * Rabbit声明队列工具类接口
 * 
 * @author liu
 * @date 2022-06-16
 */
public interface IRabbitCodeQueueUtil extends IRabbitBaseQueueUtil {

    /**
     * 声明一个默认队列</BR>
     * 该队列特点: 不持久化,排他,自动删除</BR>
     * 
     * @param channel
     * @return
     * @throws IOException
     */
    default DeclareOk getDefaultQueue(Channel channel) throws IOException {
        DeclareOk queueDeclare = channel.queueDeclare();
        // 获取队列名称
        // String queue = queueDeclare.getQueue();
        return queueDeclare;
    }

    /**
     * 声明一个队列
     * 
     * @param channel
     * @param queue     队列名
     * @return
     * @throws IOException
     */
    default DeclareOk queueDeclare(Channel channel, String queue) throws IOException {
        return queueDeclare(channel, queue, true, false, false);
    }

    /**
     * 声明一个队列
     * 
     * @param channel
     * @param queue     队列名
     * @param arguments 队列参数(默认为null)
     * @return
     * @throws IOException
     */
    default DeclareOk queueDeclare(Channel channel, String queue, Map<String, Object> arguments) throws IOException {
        return queueDeclare(channel, queue, true, false, false, arguments);
    }

    /**
     * 声明一个队列
     * 
     * @param channel
     * @param queue         队列名
     * @param durable       是否持久化</BR>
     *                      队列默认是放在内存中的,rabbitmq服务挂了队列被删除</BR>
     *                      设置为true则持久化到磁盘,rabbitmq服务挂了重启还存在</BR>
     * @param exclusive     是否排外,设置为true表示排外(当前定义的队列是connection的channel是共享的，其他的connection是访问不到的)</BR>
     *                      一般用于一个生产者和一个消费者场景,当连接关闭时会删除该队列
     * @param autoDelete    是否自动删除,当最后一个consumer(消费者)断开之后,队列将自动删除
     * @return
     * @throws IOException
     */
    default DeclareOk queueDeclare(Channel channel, String queue, boolean durable, boolean exclusive,
        boolean autoDelete) throws IOException {
        return queueDeclare(channel, queue, durable, exclusive, autoDelete, getQueueParam());
    }

    /**
     * 声明一个队列
     * 
     * @param channel
     * @param queue         队列名
     * @param durable       是否持久化</BR>
     *                      队列默认是放在内存中的,rabbitmq服务挂了队列被删除</BR>
     *                      设置为true则持久化到磁盘,rabbitmq服务挂了重启还存在</BR>
     * @param exclusive     是否排外,设置为true表示排外(当前定义的队列是connection的channel是共享的，其他的connection是访问不到的)</BR>
     *                      一般用于一个生产者和一个消费者场景,当连接关闭时会删除该队列
     * @param autoDelete    是否自动删除,当最后一个consumer(消费者)断开之后,队列将自动删除
     * @param arguments     队列参数(默认为null)
     * @return
     * @throws IOException
     */
    default DeclareOk queueDeclare(Channel channel, String queue, boolean durable, boolean exclusive,
        boolean autoDelete, Map<String, Object> arguments) throws IOException {
        return channel.queueDeclare(getQueueName(queue), durable, exclusive, autoDelete, arguments);
    }

}